package com.bugman.business.impl;

import com.bugman.dao.Dao;
import com.bugman.business.*;
import com.bugman.entity.Role;
import com.bugman.entity.User;
import com.bugman.exceptions.UsernameExistException;
import com.bugman.utils.MD5Utils;
import java.util.List;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB;
import javax.ejb.Stateless;

/**
 *
 * @author Flashman
 */
@Stateless
public class UserServiceBean extends BaseServiceBean implements UserService {

    @EJB
    Dao dao;

    /**
     * Kontroluje, zda-li uživatelské jméno již existuje v databázi
     *
     * @param username  uživatelské jméno
     * @return          true, když uživatelské jméno již existuje
     */
    public boolean usernameExist(String username) {
        return (dao.getUser(username) != null);
    }

    /**
     * Metoda zaregistruje daného uživatele do databáze a zahešuje mu heslo 
     * pomocí MD5, zkotroluje zda již toto uživatelské jméno neexistuje.
     *
     * @param newUser   objekt uživatele
     * @throws UsernameExistException       Pokud uživatel s tímto jménem již
     *                                      existuje, je vyhozena vyjímka
     */
    public void registerUser(User newUser) throws UsernameExistException {
        if(usernameExist(newUser.getNick())) throw new UsernameExistException();
        newUser.setRole(dao.getRoleById(Role.USER));
        newUser.setPassword(MD5Utils.hashStringByMD5(newUser.getPassword()));
        dao.persist(newUser);
    }

    /**
     * Uloží uživatelův profil, pokud si ho změnil
     *
     * @param user  persistentní objekt uživatele
     */
    public void saveProfile(User user) {
        user.setPassword(MD5Utils.hashStringByMD5(user.getPassword()));
        dao.merge(user);
    }

    /**
     * Nastaví uživatelovu roli na developera
     *
     * @param user  cílový uživatel
     */
    @RolesAllowed("Admin")
    public void setDeveloper(User user) {
        Role developerRole = dao.getRoleById(Role.DEVELOPER);
        user.setRole(developerRole);
        dao.merge(user);
    }

    /**
     * Nastaví role uživatelů na developera
     *
     * @param user  cílová skupina uživatelů
     */
    @RolesAllowed("Admin")
    public void setDevelopers(List<User> developers) {
        Role developerRole = dao.getRoleById(Role.DEVELOPER);
        for (User developer : developers) {
            developer.setRole(developerRole);
            dao.merge(developer);
        }

    }

        /**
     * Vrátí uživatele podle dané přezdívky
     *
     * @param  nick přezdívka hledaného uživatele
     * @return User nalezený uživatel
     */
    public User getUser(String nick) {
        return dao.getUser(nick);
    }

    /**
     * Vrátí seznam všech uživatelů
     *
     * @return List<User> seznam všech uživatelů
     */
    public List<User> getAllUsers() {
        return dao.getAllUsers();
    }

    /**
     * Vrátí seznam všech developerů až na výjimku danou parametrem
     *
     * @param except        Tohoto uživatele metoda vynechá a nevrátí ho
     * @return List<User>   seznam všech developerů kromě except
     */
    public List<User> getDevelopers(User except) {
        List<User> developers = getUsers(Role.DEVELOPER);
        developers.remove(except);
        return developers;
    }

    /**
     * Vrátí seznam všech uživatelů podle jejich role
     *
     * @param roleId        typ role
     * @return List<User>   seznam všech uživatelů podle role
     */
    public List<User> getUsers(Byte roleId) {
        return dao.getUsers(roleId);
    }

      /**
     * Vrátí seznam uživatelů podle jejich ID
     *
     * @param userIds        seznam uživatelských ID
     * @return List<User>   seznam všech uživatelů podle jejich ID
     */
    public List<User> getUsers(List<Integer> userIds) {
        return dao.getUsers(userIds);
    }
 
}